package com.servlet.contacts;

import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

import com.listener.ContextListener;
import com.servlet.model.algorithmes.AccountComparator;
import com.servlet.model.base.Contact;
import com.servlet.model.base.Profile;

/**
 * Servlet utilisée 
 * @author Marc Bouffard
 */
public class SelecteurContact
{
	/**
	 * 
	 * @param Initialise la méthode récursive de Round Proche
	 * Round Proche : Méthode recursive qui va chercher jusqu'a une limite les contact de contact de contact ...
	 * @param limite limite du nombre de contacts
	 * @return l'ensemble des contacts trouvés dans la limite imposée
	 */
	public static TreeSet<Profile> getProche( String email , int limite )
	{
		HashMap<String,Integer> hm = new HashMap<String, Integer>();
		
		ArrayList<String> s1 = roundProche( email , hm , limite , 0);
		
		System.out.println("s1 : " + s1);
		
		ArrayList<String> s2 = roundProche( email , hm , 0 , 0);
		
		System.out.println("s2 : " + s2);
		
		while( s1.removeAll(s2) );
		
		System.out.println("s3 : " + s1);
		
		TreeSet<Profile> t = new TreeSet<Profile>( new AccountComparator<Profile>() );
		
		for( int i = 0 ; i < s1.size() ; i++ )
		{
			Profile p = ContextListener.base.findProfile(s1.get(i));

			p.setNiveau( hm.get(s1.get(i) ));
			
			t.add(p);
		}
		
		System.out.println("t2 : " + t );
		
		return t;
	}
	
	/**
	 * Méthode recursive qui va chercher jusqu'a une limite les contact de contact de contact ...
	 * @param email email de l'utilisateur effectuant la recherche
	 * @param hm
	 * @param limite nombre de contacts maximum
	 * @param niveau profondeur de la recherche (au niveau 1 on cherche parmi les contacts de nos contacts)
	 * @return l'ensemble des contacts trouvés dans la limite imposée
	 */
	public static ArrayList<String> roundProche( String email , HashMap<String, Integer> hm, int limite , int niveau )
	{
		ArrayList<Contact> contacts = ContextListener.base.findContacts(email);
		
		ArrayList<String> res = new ArrayList<String>();

		for( int i = 0 ; i < contacts.size() ; i++ )
		{
			if( contacts.get(i).getIs_accepted() )
			{
				if( contacts.get(i).getEmail_user1().compareTo(email) == 0 )
				{
					res.add( contacts.get(i).getEmail_user2() );
					
					if( hm.get(contacts.get(i).getEmail_user2()) == null || hm.get(contacts.get(i).getEmail_user2()) > niveau  )
					{
						//System.out.println(contacts.get(i).getEmail_user2() + " a " + niveau);
						hm.put(contacts.get(i).getEmail_user2() , niveau);
					}
				}
				else
				{
					res.add( contacts.get(i).getEmail_user1() );
					
					if( hm.get(contacts.get(i).getEmail_user1()) == null || hm.get(contacts.get(i).getEmail_user1()) > niveau  )
					{
						//System.out.println(contacts.get(i).getEmail_user1() + " a " + niveau);
						hm.put(contacts.get(i).getEmail_user1() , niveau);
					}
				}
			}
		}

		ArrayList<String> res2 = new ArrayList<String>();
		
		for( int i = 0 ; i < res.size() ; i++ )
		{
			if( niveau < limite )
			{
				res2.addAll( roundProche( res.get(i) , hm , limite , niveau+1 ) );
			}
		}
		
		res.addAll(res2);
		
		while( res.remove(email) );
		
        Set set = new HashSet() ;
        set.addAll(res) ;
        ArrayList distinctList = new ArrayList(set) ;
		
		return distinctList;
	}
}
